Android – 计步传感器

前言

之前写过一篇关于计步器(–> Android – 计步器的实现 <–)的文章,里面只是简单的介绍了一下原理,其实最重要的是看了大牛的各种优化,源码地址也放进去了。不得不说,大佬就是大佬。

本文主要是记录一下传感器该怎么玩,大佬请拍砖。

首先要在要在manifest中声明需要的软硬件特性:

1
2
3
4
5
6
7
8
<!--计步传感器-->
<uses-feature
android:name="android.hardware.sensor.stepcounter"
android:required="true" />
<!--步行检测传感器-->
<uses-feature
android:name="android.hardware.sensor.stepdetector"
android:required="true" />

emmm,这里我还想在啰嗦几句。计步传感器返回的是从开机至当前的步数,当重启手机后清零,因为是硬件传感器,所以精度高且低功耗,不需要后台保活。步行检测传感器只是用来检测走步,每次返回 1 或 0 。需要长时间计步建议使用计步传感器。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class ToolsTodayStep extends Activity implements SensorEventListener {
private TextView mTextViewStepNumber;
private SensorManager mSensorManager;
private Sensor mSensorCounter;
private Sensor mSensorDetector;
private int counterStep = 0;
private int counterDetector = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tools_today_step);
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensorCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
mSensorDetector = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);
initView();
}
@Override
protected void onResume() {
super.onResume();
/**
* 注册传感器的三个参数说明
* 1. 接收信号的Listener实例
* 2. 传感器类型
* 3. 接收频度
*/
mSensorManager.registerListener(this, mSensorCounter, SensorManager.SENSOR_DELAY_UI);
mSensorManager.registerListener(this, mSensorDetector, SensorManager.SENSOR_DELAY_UI);
}
private void initView() {
mTextViewStepNumber = findViewById(R.id.tv_stepNumber);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
//当传感器值发生变化时
if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
//启动可能需要十步
counterStep = (int) sensorEvent.values[0] + 10;
} else if (sensorEvent.sensor.getType() == Sensor.TYPE_STEP_DETECTOR) {
counterDetector++;
}
mTextViewStepNumber.setText("当前走了 " + counterDetector + " 步" + " ,总共走了 " + counterStep + " 步");
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
//当传感器精度发生变化时
}
}

布局就不放了,就一个TextView。实践了一下,如果APP停留后台的话,可一直看到当前步数和总步数变化,还是很准确的。当关闭APP之后,当前步数就清零了,但总步数还在累加。

需要优化的还很多,本菜鸡还在看大佬源码。。。

参考

http://blog.csdn.net/qq_21051503/article/details/73127662

http://blog.csdn.net/fukaimei/article/details/78306097

http://www.jianshu.com/p/5d57f7fd84fa

http://blog.csdn.net/WTunique/article/details/54581476

http://blog.csdn.net/niuzhucedenglu/article/details/53378265

http://blog.csdn.net/niuzhucedenglu/article/details/53379385

http://www.jianshu.com/p/cfc2a200e46d

我们一直都向往,面朝大海,春暖花开。 但是几人能做到,心中有爱,四季不败?